﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct PersonString
{
	char name[64];
	int age;
};
struct TeacherPointer
{
	char* name;
	int age;
};
void printArray1(int* arr, int len) {}
void printArray2(int(*arr)[3], int len) {}
void printArray3(char** arr, int len) {}
void testArrayString()
{
	//5.arr的类型是char**；
	char* arr[] = { "aaa","bbb","ccc","ddd" };
	printArray3(arr, 4);


#if 0
	char* p1 = "aaa";
	char* p2 = "bbb";
	char* p3 = "ccc";
	char* p4 = "ddd";

	char* arr[] = { p1, p2, p3, p4 };
#endif
	//1.错误写法；上面arr[0]="aaa";这里的*arr只能是个地址&arr[0]，存储的是*arr，而不是字符串常量；
	//char** arr = { "aaa","bbb","ccc","ddd" };

	//2.返回的是首元素的地址；
	char** arr6 = malloc(sizeof(char*) * 4);

	//3.除了sizeof，对数组名取地址，这两种情况下，其他任何情况下数组名都是指向首元素的指针；
	int arr1[10];//arr1是int*类型；
	printArray1(arr1, 10);

	//4.此时arr2的类型为int(*)[3];
	int arr2[3][3] = {
		{1,2,3},
		{4,5,6},
		{7,8,9}
	};
	printArray2(arr2, 3);

	//6.arr3是char***类型；
	char** arr3[4];

	//7.&arr4的地址，指向的是整个数组，而不是单个元素；
	int arr4[3];
	//8.定义数组类型，指向arr4；
	typedef int(ARRAY_TYPE_DEF)[3];
	ARRAY_TYPE_DEF* p1 = &arr4;

	//9.定义数组指针类型，指向arr4；
	typedef int(*ARRAY_POINTER_TYPE)[3];
	ARRAY_POINTER_TYPE p2 = &arr4;

	int arr5[4];
	//10.下面直接报错，因为定义的ARRAY_POINTER_TYPE元素为3个，不能将arr5赋值给p2；
	//p2 = &arr5;

	//11.直接使用数组指针类型，指向arr4；
	int(*p3)[3] = &arr4;

	//12.只要结构体struct PersonString内部，不涉及到指针，那么使用默认操作是没有问题的；
	struct PersonString ps1, ps2;
	//13.结构体赋值；
	//ps2 = ps1;

	//14.如果结构体struct TeacherPointer这种，成员name为char*指针类型，且指针指向堆内存，就不能使用默认操作了；

}

//main208：数组和字符串常量取值
int main208()
{
	testArrayString();

	system("pause");
	return EXIT_SUCCESS;
}